package com.im.service;

import com.im.common.ClientLinkInfo;
import com.im.common.MessageEntity;
import com.im.util.ConstantUtil;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

import static com.im.util.ConstantUtil.TARGET_ID;

/**
 * @Author: szw
 * @Date: 2021/5/11 12:08
 */
@Slf4j
public class MessageService {

    /**
     * 推送消息
     */
    public int push(MessageEntity messageEntity) {
        List<String> targetUserIds = messageEntity.getTargetUserIds();
        if (targetUserIds == null || targetUserIds.isEmpty()) {
            targetUserIds = new ArrayList<>();
        }

        if (StringUtils.isNotBlank(messageEntity.getTargetUserId())) {
            targetUserIds.add(messageEntity.getTargetUserId());
        }
        targetUserIds = targetUserIds.stream().distinct().collect(Collectors.toList());
        String sendUserId = messageEntity.getSendUserId();

        //同一个推送pushId相同
        String pushId = UUID.randomUUID().toString().replace("-", "");
        Date now = new Date();

        // 执行推送
        for (int i = 0; i < targetUserIds.size(); i++) {
            String targetUserId = targetUserIds.get(i);
            try {
                // 获取通道
                Optional<List<ClientLinkInfo>> channel = ConstantUtil.get(targetUserId);
                Optional<ClientLinkInfo> onlineTarget = channel.orElse(new ArrayList<>()).stream()
                        .filter(f -> /**StringUtils.isBlank(targetUserId)**/f.getTargetId().equals(TARGET_ID) || f.getTargetId().equals(sendUserId))
                        .findFirst();
                // Optional<ClientLinkInfo> onlineTarget = UserChannelService.get(targetUserId);

                if (!onlineTarget.isPresent()) {
                    log.error("推送的目标不在线：targetUserId:{}", targetUserId);
                    //return -1;
                } else {
                    /*MessageEntity message =
                            MessageEntity.builder().pushId(pushId).code(200)
                                    .data(messageEntity.getData()).createTime(now).pushType(messageEntity.getPushType())
                                    .build();*/
                    // 写入数据推送
                    onlineTarget.get().getChannel()
                            .writeAndFlush(new TextWebSocketFrame(messageEntity.getData()));
                }
            } catch (Exception e) {
                log.error("推送目标{}异常！{}{}", targetUserId, messageEntity.getData(), e);
                return -2;
            }
        }

        // 保存推送记录
        return 0;
    }

    public void listen(MessageEntity message) {
//        log.info(message.toString());
    }
}
